package
{
	import flash.events.Event;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	
	import models.GroupeResisable;
	import models.ImageToShow;
	import models.TextToShow;
	import models.Title;
	import models.VideoToShow;
	
	import mx.containers.Canvas;
	import mx.containers.Panel;
	import mx.containers.ViewStack;
	import mx.controls.Spacer;
	
	import org.efflex.mx.viewStackEffects.FlipPapervision3DTile;
	
	public class PageFactory
	{
		private var viewstackToShow:ViewStack;
		private var filesDirectory:String = "fr/pages/";
		private var currentPageLoading:String;
		
		/**
		 * Cette fonction est le constructeur de la classe
		 * @param viewstack le viewstack du fichier um2.mxml 
		 */ 
		public function PageFactory(viewstack:ViewStack)
		{
			this.viewstackToShow = viewstack;
		}
		
		
		/**
		 * Cette fonction permet d'ajouter un nouvel élément dans le panel en cours
		 * @element L'élément courant en cours d'ajout
		 * @container Le panel auquel l'élément doit être ajouté
		 */ 
		private function addNewElementInPanel(element:XML,container:Panel):void{
			
			if(element.name()=="title"){
				var title:Title = new Title(element.@value);
				container.addChild(title);
			}
			else if(element.name()=="text"){
				var textToShow:TextToShow = new TextToShow(element.children());
				container.addChild(textToShow);
			}
			else if(element.name()=="image"){
				var image:ImageToShow = new ImageToShow(element.@path,element.@height,element.@width);
				container.addChild(image);
			}
			else if(element.name()=="video"){
				var video:VideoToShow = new VideoToShow(element.@path,element.@height,element.@width);
				container.addChild(video);
				var space:Spacer = new Spacer();
				space.height = 20;
				container.addChild(space);
				
			}
			else if(element.name()=="groupResisable"){
				var groupResisable:GroupeResisable = new GroupeResisable(element.@value);
				var subContent:XMLList = element.children();
				for(var i:int = 0;i<subContent.length();i++){
					addNewElementInPanel((subContent[i] as XML),groupResisable.panelInfo);
				}
				container.addChild(groupResisable);
			}	
		}
		
		/**
		 * Cette fonction est appellée une fois que le fichier xml est chargé
		 * @event l'evenement déclencheur de la fonction, ici le fichier xml est chargé
		 */ 
		private function createNewPageFromXml(event:Event):void{
			
			var modele:XML = new XML(event.target.data);
			
			var newPageToShow:Canvas = new Canvas();
			newPageToShow.data = currentPageLoading;
			newPageToShow.percentHeight=100;
			newPageToShow.percentWidth=100;
			
			var containerCenter:Panel = new Panel();
			containerCenter.percentHeight=100;
			containerCenter.percentWidth=100;
						
			var containerRight:Panel = new Panel();
			containerRight.percentHeight=100;
			containerRight.width=200;
			
			newPageToShow.addChild(containerCenter);
			
			
			var menus:Array = new Array();
			var menuNodes:XMLList = modele.children();
			var menuNodesElements:XMLList;
			var j:int = 0;
			
			for(var i:int = 0;i<menuNodes.length();i++){
				if((menuNodes[i] as XML).name()=="center"){
					
					menuNodesElements = (menuNodes[i] as XML).children();
					for(j = 0;j<menuNodesElements.length();j++){
						addNewElementInPanel((menuNodesElements[j] as XML),containerCenter);
					}			
					
				}
				else if((menuNodes[i] as XML).name()=="right"){
					
					menuNodesElements = (menuNodes[i] as XML).children();
					for(j = 0;j<menuNodesElements.length();j++){
						addNewElementInPanel((menuNodesElements[j] as XML),containerRight);
					}			
					
				}
				
			}
			
			var flip:FlipPapervision3DTile = new FlipPapervision3DTile();
			flip.duration=1000;
			flip.transparent=true;
			newPageToShow.setStyle("showEffect", flip);
			newPageToShow.setStyle("hideEffect", flip);
			
			viewstackToShow.addChild(newPageToShow);

		}
		
		
		/**
		 * Cette méthode permet de créer une nouvelle page et de l'ajouter au viewstack
		 * grâce à sa définition dans un fichier xml
		 */ 
		public function createNewPage(newPage:String):void{
			currentPageLoading = newPage;
			var service:URLLoader = new URLLoader(new URLRequest(filesDirectory+newPage+".xml"));
			service.addEventListener(Event.COMPLETE,createNewPageFromXml);	
		}

	}
}